package ca.etsmtl.log120.tp1.shapehierarchy;

import java.awt.Color;
import java.awt.Graphics;

/******************************************************
Cours : LOG120
Session : E2011
Groupe : 01
Projet : Laboratoire #2
Etudiants : Nicolas Blais Miko
 	 		Yohan Trepanier-Montpetit
Codes perm. : BLAN24079109
			  TREY
Professeur : Chamseddine Talhi
Charge de labo : Eric Goulet
Nom du fichier : Rectangle.java
Date cree : 2011-05-18
Date dern. modif. 2015-05-23
*************************************************** ****
Historique des modifications
*************************************************** ****
2011-05-18 Version initiale (Nicolas Blais Miko)
2011-05-24 Implementation de drawShape() (Yohan Trepanier)
***************************************************/

/**
 * Classe permettant de representer un rectangle
 * @param pointX La coordonnee en X du second sommet du rectangle
 * @param pointY La coordonnee en Y du second sommet du rectangle
 */
public class Rectangle extends AbstractShape{

	private static final int SHAPE_ID = 1;
	private int pointX;
	private int pointY;
	private Color color = Color.yellow;
	
	/**
	 * 
	 * CONSTRUCTEURS
	 * 
	 */
	
	/**
	 * Constructeur par defaut
	 */
	public Rectangle(){}
	
	/**
	 * Constructeur parametrique
	 * @param nseq Le numero de sequence de la forme
	 * @param posX La position en X de la forme
	 * @param posY La position en Y de la forme
	 * @param pointX La coordonnee en X du second sommet du rectangle
	 * @param pointY La coordonnee en Y du second sommet du rectangle
	 */
	public Rectangle(int nseq, int posX, int posY, int pointX, int pointY){
		
		super(nseq, posX, posY,SHAPE_ID);
		this.pointX = pointX;
		this.pointY = pointY;
	}
	
	/**
	 * Constructeur par copie d'objet
	 * @param r Le rectangle a construire
	 */
	public Rectangle(Rectangle r){
		
		super(r.getNseq(),r.getPosX(),r.getPosY(),SHAPE_ID);
		pointX = r.getPointX();
		pointY = r.getPointY();
	}

	/**
	 * 
	 * ACCEUSSEURS 
	 *
	 */
	
	public int getPointX() {

		return pointX;
	}
	
	public int getPointY() {
		
		return pointY;
	}
	
	/**
	 * 
	 * COMPORTEMENTS
	 * 
	 */
	
	/**
	 * Methode qui decrit un rectangle avec une chaine de caractere
	 */
	public String toString(){
		
		return super.toString() + "Sommet #2: " + "(" + pointX + "," + pointY + ")" + " Type de forme: Rectangle"; 
	}
	
	/**
	 * Methode qui retourne true si le rectangle recu en parametre est identique au rectangle qui appel
	 * @param shape Le rectangle avec lequel on compare
	 * @return vrai si les deux rectangles sont identiques
	 */
	public boolean equals(Object obj){
		Rectangle shape = (Rectangle)obj;
		return super.equals(shape) && pointX == shape.pointX && pointY == shape.pointY;
	}
	
	/**
	 * Methode qui retourne un copie du rectangle recu en parametre
	 * @param r Le rectangle a copier
	 * @return Une instance de Rectangle identique au Rectangle recu
	 */
	public Rectangle copyOf(){
		
		return new Rectangle(this);
	}

	@Override
	public void drawShape(Graphics g2d) {
		g2d.setColor(color);
		g2d.fillRect(posX, posY, pointX-posX, pointY-posY);
		
	}

	@Override
	public double getAire() {
		
		return (double)getHauteur()*(double)getLargeur();
	}

	@Override
	public int getHauteur() {
		
		return Math.abs(pointX-posX);
	}

	@Override
	public int getLargeur() {
		
		return Math.abs(pointY-posY);
	}

	@Override
	public double getDistance() {
		
		return Math.sqrt(Math.pow((double)getHauteur(),2)+Math.pow((double)getLargeur(),2));
	}
	
	@Override
	public void setPosition(int x, int y) {
	
		int largeur = getLargeur();
		int hauteur = getHauteur();
		
		posX = x;
		posY = y;
		pointX = x+largeur;
		pointY = y+hauteur;
	}
}
